package com.adee.design.create.factory;


/*
 * 简单工厂模式
 * 一个工厂类可以生产同一类型的多款产品，但是每添加一款新产品，就要修改create方法，
 * 违反了开闭原则。可以使用工厂方法模式，每新增一中产品，就新增一个具体工厂类。
 * */
public class SimpleFactoryTest {
    public static void main(String[] args) {
        SimpleCarFactory factory = new SimpleCarFactory();
        IBmwCar x7SuvGray = factory.createCar("X7SuvGray");
        IBmwCar the7CommonBlack = factory.createCar("The7CommonBlack");
    }

    // 简单工厂（宝马车工厂，可以造不同类型（suv、轿车、mpv）、不同系列（7系、5系、3系）、不同颜色的车）
    // 新增一种车就要修改SimpleCarFactory.createCar方法
    public static class SimpleCarFactory {
        public IBmwCar createCar(String arg) {
            if("X7SuvGray".equals(arg)) {
                return new X7SuvGrayBmwCar();
            } else if("The7CommonBlack".equals(arg)) {
                return new The7CommonBlackBmwCar();
            } else {
                return null;
            }
        }
    }

    /*
    * 抽象产品（宝马车）
    * 类型 suv、轿车common、mpv
    * 系列 7系、5系、3系、X7、X5、X3
    * 颜色 黑色、白色、灰色
    *
    * 产品特点：只要类型、系列、颜色有一个不同，就算一个新产品，就要新建一个类
     * */
    interface IBmwCar {
        public abstract void engine(); // 发动机
        public abstract void platform(); // 车架
        public abstract void decoration(); // 装饰
        public abstract void assemble(); // 装配
        public abstract void test(); // 测试
    }

    // 具体产品1（灰色X7 suv）
    static class X7SuvGrayBmwCar implements IBmwCar {

        @Override
        public void engine() {
            System.out.println("宝马X7 Suv 灰色动机");
        }

        @Override
        public void platform() {
            System.out.println("宝马X7 Suv 灰色架构");
        }

        @Override
        public void decoration() {
            System.out.println("宝马X7 Suv 灰色内饰");
        }

        @Override
        public void assemble() {
            System.out.println("宝马X7 Suv 灰色装配");
        }

        @Override
        public void test() {
            System.out.println("宝马X7 Suv 灰色测试");
        }
    }
    // 具体产品2（黑色7系轿车）
    static class The7CommonBlackBmwCar implements IBmwCar {

        @Override
        public void engine() {
            System.out.println("黑色7系轿车动机");
        }

        @Override
        public void platform() {
            System.out.println("黑色7系轿车架构");
        }

        @Override
        public void decoration() {
            System.out.println("黑色7系轿车内饰");
        }

        @Override
        public void assemble() {
            System.out.println("黑色7系轿车装配");
        }

        @Override
        public void test() {
            System.out.println("黑色7系轿车测试");
        }
    }

}
